/**
 * Copyright(c) 2013 Jade Techonologies Co., Ltd.
 *
 * History:
 *   13-4-23 下午10:18 Created by dwzhang
 */
package com.jade.framework.base.criterion.sql;

import com.jade.framework.base.criterion.Constants;
import com.jade.framework.base.criterion.CriterionInterpreter;
import com.jade.framework.base.criterion.QueryEntity;
import org.apache.commons.lang3.StringUtils;

/**
 * 注入的实体/表的解释器.
 *
 * @author dwzhang
 * @version 1.0 13-4-23 下午10:18
 */
public class InjectEntityInterpreter implements CriterionInterpreter<SqlContext, QueryEntity>
{
    /**
     * 对表达式进行解析，形成可以用于实际查询的上下文。
     * context中先用于保存sql查询语句.
     *
     * @param context 解析上下文。
     * @param entity  需要解析的对象，只包括Entity列表对象等等。
     */
    public void interprete(SqlContext context, QueryEntity entity)
    {
        String prefix = context.getContextString();
        int index = prefix.toUpperCase().indexOf(Constants.WHERE) - 1;
        if (index > 0) {
            String suffix = prefix.substring(index);
            context.getNativeString().delete(index, prefix.length());
            injectSQL(context, entity);
            context.append(suffix);
        }
        else {
            injectSQL(context, entity);
            context.append(Constants.BLANK);
        }
    }

    /**
     * 注入entity sql语句.
     *
     * @param context 解释器上下文
     * @param entity  注入的entity实体
     */
    private void injectSQL(SqlContext context, QueryEntity entity)
    {
        if (StringUtils.isNotBlank(entity.getJoin())) {
            context.append(Constants.BLANK);
            context.append(entity.getJoin());
        }
        else {
            context.append(Constants.COMMA);
        }
        context.append(Constants.BLANK);
        context.append(entity.getEntityName());
        context.append(Constants.BLANK);
        context.append(entity.getAlias());
    }
}
